package br.edu.universo.si.projeto2.infojob.client.apresentacao;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanEmpresaAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanMensagem;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalAssinante;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ErrorDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.InformationDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.SuccessDialogBox;
import br.edu.universo.si.projeto2.infojob.client.util.Util;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

public class ANovaMensagem extends DialogBox
{
	private BeanAssinante destinatario;
	
	private FlexTable grid;
	
	private TextBox assuntoTxt;
	private TextArea mensagemArea;
	
	HorizontalPanel rodape;

	private Button enviarBtn;
	private Button limparBtn;
	private Button fecharBtn;
	
	public ANovaMensagem(Integer idDestinatario)
	{
		this.setText("Escreva uma mensagem...");

		rodape = new HorizontalPanel();
		rodape.setSpacing(3);

		grid = new FlexTable();

		assuntoTxt = new TextBox();
		mensagemArea = new TextArea();

		assuntoTxt.setWidth("500px");
		mensagemArea.setSize("500px", "200px");

		enviarBtn = new Button("Enviar");
		limparBtn = new Button("Limpar");
		fecharBtn = new Button("Fechar");

		// adiciona os botoes
		rodape.add(enviarBtn);
		rodape.add(limparBtn);
		rodape.add(fecharBtn);

		AsyncCallback<BeanAssinante> cbDestinatario = new AsyncCallback<BeanAssinante>()
		{
			public void onSuccess(BeanAssinante result)
			{
				destinatario = result;
			};

			public void onFailure(Throwable caught){ };
		};

		Util.getService().getAssinanteById(idDestinatario, cbDestinatario);

		if (destinatario instanceof BeanProfissionalAssinante)
		{
			grid.setWidget(0, 0, new HTML("Para: " + ((BeanProfissionalAssinante) destinatario).getNome() ));
		}

		if (destinatario instanceof BeanEmpresaAssinante)
		{
			grid.setWidget(0, 0, new HTML("Para: " + ((BeanEmpresaAssinante) destinatario).getRazaoSocial() ));			
		}
		
		grid.getFlexCellFormatter().setColSpan(0, 0, 2);

		grid.setWidget(1, 0, new HTML("Assunto:"));
		grid.setWidget(1, 1, assuntoTxt);
		
		grid.setWidget(2, 0, new HTML("Mensagem: "));
		grid.setWidget(2, 1, mensagemArea);
		
		grid.setWidget(3, 0, rodape);
		
		grid.getFlexCellFormatter().setColSpan(3, 0, 2);

		grid.getFlexCellFormatter().setAlignment(1, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		grid.getFlexCellFormatter().setAlignment(2, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);

		// BOTAO LIMPAR
		limparBtn.addClickListener(
			new ClickListener()
			{
				public void onClick(Widget sender)
				{
					assuntoTxt.setText("");
					mensagemArea.setText("");
				}
			}
		);
		
		// BOTAO FECHAR
		fecharBtn.addClickListener(
			new ClickListener()
			{
				public void onClick(Widget sender)
				{
					ANovaMensagem.this.hide();
				}
			}
		);
		
		// BOTAO ENVIAR
		enviarBtn.addClickListener(
			new ClickListener()
			{
				public void onClick(Widget sender)
				{
					BeanMensagem mensagem = new BeanMensagem();

					// seta o destinatario
					if (destinatario instanceof BeanProfissionalAssinante)
					{
						mensagem.setDestinatario((BeanProfissionalAssinante) destinatario);
					}

					if (destinatario instanceof BeanEmpresaAssinante)
					{
						mensagem.setDestinatario((BeanEmpresaAssinante) destinatario);			
					}

					mensagem.setAssunto(assuntoTxt.getText());
					mensagem.setMensagem(mensagemArea.getText());

					AsyncCallback cbMensagemEnviada = new AsyncCallback()
					{
						public void onSuccess(Object result)
						{
							ANovaMensagem.this.hide();

							SuccessDialogBox successDialogBox = new SuccessDialogBox("Mensagem enviada com sucesso.");

							successDialogBox.center();
							successDialogBox.show();
						};

						public void onFailure(Throwable caught)
						{
							ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao enviar mensagem: " + caught.getMessage());

							errorDialogBox.center();
							errorDialogBox.show();
						};
					};

					if (verificarCampos())
					{
						Util.getService().enviarMensagem(mensagem, cbMensagemEnviada);
					}
				}
			}
		);
		
		this.add(grid);

	}
	
	private boolean verificarCampos()
	{
		if (assuntoTxt.getText().equalsIgnoreCase(""))
		{
			InformationDialogBox infoDialogBox = new InformationDialogBox("Preencha o assunto da mensagem.");

			infoDialogBox.center();
			infoDialogBox.show();

			return false;
		}
		
		if (mensagemArea.getText().equalsIgnoreCase(""))
		{
			InformationDialogBox infoDialogBox = new InformationDialogBox("Escreva uma mensagem.");

			infoDialogBox.center();
			infoDialogBox.show();

			return false;			
		}

		return true;
	}
}